﻿//
// ParallelGrep
//
// Copyright (C) 2011 - Tatsuya Niioka
//
using System;
using System.Configuration;

namespace ParallelGrep.Configuration
{
    /// <summary>
    /// 構成コレクション
    /// </summary>
    public class ConfigCollection : ConfigurationElementCollection
    {
        #region Constructor
        /// <summary>
        /// 新しい<see cref="ConfigCollection"/>クラスを生成します。
        /// </summary>
        public ConfigCollection()
        {
        }
        #endregion

        #region CollectionType
        /// <summary>
        /// コレクションタイプを取得します。
        /// </summary>
        public override ConfigurationElementCollectionType CollectionType
        {
            get
            {
                return ConfigurationElementCollectionType.AddRemoveClearMap;
            }
        }
        #endregion

        #region CreateNewElement
        /// <summary>
        /// 新しいエレメントを作成します。
        /// </summary>
        /// <returns>エレメント</returns>
        protected override ConfigurationElement CreateNewElement()
        {
            return new ConfigElement();
        }
        #endregion

        #region CreateNewElement
        /// <summary>
        /// 指定した名前で新しいエレメントを作成します。
        /// </summary>
        /// <param name="name">名前</param>
        /// <returns></returns>
        protected override ConfigurationElement CreateNewElement(string name)
        {
            return new ConfigElement() { Name = name };
        }
        #endregion

        #region GetElementKey
        /// <summary>
        /// 指定したエレメントでオブジェクトを取得します。
        /// </summary>
        /// <param name="element">エレメント</param>
        /// <returns>オブジェクト</returns>
        protected override Object GetElementKey(ConfigurationElement element)
        {
            return ((ConfigElement)element).Name;
        }
        #endregion

        #region AddElementName
        /// <summary>
        /// クリアエレメント名を取得または設定します。
        /// </summary>
        public new string AddElementName
        {
            get
            { 
                return base.AddElementName; 
            }

            set
            { 
                base.AddElementName = value; 
            }
        }
        #endregion

        #region ClearElementName
        /// <summary>
        /// クリアエレメントを取得または設定します。
        /// </summary>
        public new string ClearElementName
        {
            get
            { 
                return base.ClearElementName; 
            }
            set
            {
                base.ClearElementName = value; 
            }
        }
        #endregion

        #region RemoveElementName
        /// <summary>
        /// 削除エレメント名称を取得または設定します。mve
        /// </summary>
        public new string RemoveElementName
        {
            get
            { 
                return base.RemoveElementName; 
            }
        }
        #endregion

        #region Count
        /// <summary>
        /// カウントを取得します。
        /// </summary>
        public new int Count
        {
            get { 
                return base.Count;
            }
        }
        #endregion

        #region this[index]
        /// <summary>
        /// 指定したインデックスでエレメントを取得します。
        /// </summary>
        /// <param name="index">インデックス</param>
        /// <returns>エレメント</returns>
        public ConfigElement this[int index]
        {
            get
            {
                return (ConfigElement)BaseGet(index);
            }
            set
            {
                if (BaseGet(index) != null)
                {
                    BaseRemoveAt(index);
                }
                BaseAdd(index, value);
            }
        }
        #endregion

        #region this[string name]
        /// <summary>
        /// 指定した名称でエレメントを取得します。
        /// </summary>
        /// <param name="name">名前</param>
        /// <returns></returns>
        new public ConfigElement this[string name]
        {
            get
            {
                return (ConfigElement)BaseGet(name);
            }
        }
        #endregion

        #region IndexOf
        /// <summary>
        /// 指定したエレメントを検索し、List 全体内で最初に見つかった位置の 0 から始まるインデックスを返します。 
        /// </summary>
        /// <param name="element"></param>
        /// <returns></returns>
        public int IndexOf(ConfigElement element)
        {
            return BaseIndexOf(element);
        }
        #endregion

        #region Add
        /// <summary>
        /// 指定したエレメントを追加します。
        /// </summary>
        /// <param name="element"></param>
        public void Add(ConfigElement element)
        {
            BaseAdd(element);

            // Add custom code here.
        }
        #endregion

        #region BaseAdd
        /// <summary>
        /// 指定したエレメントを追加します。
        /// </summary>
        /// <param name="element">エレメント</param>
        protected override void BaseAdd(ConfigurationElement element)
        {
            BaseAdd(element, false);
            // Add custom code here.
        }
        #endregion

        #region Remove
        /// <summary>
        /// 指定したエレメントで削除します。
        /// </summary>
        /// <param name="element">エレメント</param>
        public void Remove(ConfigElement element)
        {
            if (BaseIndexOf(element) >= 0)
            {
                BaseRemove(element.Name);
            }
        }
        #endregion

        #region RemoveAt
        /// <summary>
        /// 指定したインデックスで削除します。
        /// </summary>
        /// <param name="index">インデックス</param>
        public void RemoveAt(int index)
        {
            BaseRemoveAt(index);
        }
        #endregion

        #region Remove
        /// <summary>
        /// 指定した名前で削除します。
        /// </summary>
        /// <param name="name">名前</param>
        public void Remove(string name)
        {
            BaseRemove(name);
        }
        #endregion

        #region Clear
        /// <summary>
        /// クリアします。
        /// </summary>
        public void Clear()
        {
            BaseClear();
            // Add custom code here.
        }
        #endregion
    }
}
